//
//  AccessToken.swift
//  haiTwitter
//
//  Created by mohen on 15/3/13.
//  Copyright (c) 2015年 mohen. All rights reserved.
//

import UIKit

class AccessToken: NSObject, NSCoding {
    
    var access_token: String?
    
    
    var expires_in: NSNumber? {
        didSet {
            expiresDate = NSDate(timeIntervalSinceNow: expires_in!.doubleValue)
        }
    }
    
    ///  token 过期日期
    var expiresDate: NSDate?
    
    /// 比较是否过期了
    var isExpired: Bool {
        return expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedAscending
    }
    
    ///  access_token的生命周期（该参数即将废弃，开发者请使用expires_in）。
    var remind_in: NSNumber?
    
    ///  ///  当前授权用户的UID，可以通过这个 id 获取用户的进一步信息
    ///  整数类型如果要归档&接档，需要使用 Int 类型，NSNumber 会不正常！
    var uid: Int = 0
    
    ///  构造函数，一旦写了， init 会被忽略
    init(dict: NSDictionary) {
        super.init()
        
        self.setValuesForKeysWithDictionary(dict as! [NSObject : NSObject])
    }
    
    ///  将数据保存到沙盒
    func saveAccessToken() {
        NSKeyedArchiver.archiveRootObject(self, toFile: AccessToken.tokenPath())
    }
    
    class func loadAccessToken() -> AccessToken {
        return NSKeyedUnarchiver.unarchiveObjectWithFile(tokenPath()) as! AccessToken
    }
    
    ///  获取沙盒路径
    ///
    ///  :returns: 返回保存在沙盒的路径
    class func tokenPath() ->String {
        var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last as! String
        
        path = path.stringByAppendingPathComponent("WBToken.plist")
        
        return path
    }
    
    // 在 Swift  中归档和解档，如果不制定键名，会使用 属性名称作为 Key
    // 如果写了归档和解档方法， 至少需要有一个构造函数
    ///  归档方法
    ///
    ///  :param: encoder
    func encodeWithCoder(encoder: NSCoder) {
        encoder.encodeObject(access_token)
        encoder.encodeObject(expiresDate)
        
        // 如果是基本数据类型，需要制定 key
        encoder.encodeInteger(uid, forKey: "uid")
    }
    
    ///  解档方法，NSCoding 需要的方法 - required 的构造函数不能写在 extension 中
    /// 覆盖构造函数
    required init(coder decoder: NSCoder) {
        access_token = decoder.decodeObject() as? String
        expiresDate = decoder.decodeObject() as? NSDate
        uid = decoder.decodeIntegerForKey("uid")
    }
}

// extension 是一个分类， 分类不允许有储存能力
// 如果要打印对象信息， OC 中的description， 在Swift 中需要遵守协议 DebugPrintable
extension AccessToken: DebugPrintable {
    
    override var debugDescription: String {
        let dict = self.dictionaryWithValuesForKeys(["access_token", "expireDate", "uid"])
        return "\(dict)"
    }
    
}

